JavaScriptãã³ã¬ãŒã¿ã®ããã©ãŒãã³ã¹ãžã®åœ±é¿ãæ¢ããã¡ã¿ããŒã¿åŠçã®ãªãŒããŒãããã«çŠç¹ãåœãŠãæé©åæŠç¥ãæäŸããŸããã¢ããªã±ãŒã·ã§ã³ã®ããã©ãŒãã³ã¹ãæãªãããšãªããã³ã¬ãŒã¿ã广çã«äœ¿çšããæ¹æ³ãåŠã³ãŸãã
JavaScriptãã³ã¬ãŒã¿ã®ããã©ãŒãã³ã¹ãžã®åœ±é¿ïŒã¡ã¿ããŒã¿åŠçã®ãªãŒããŒããã
JavaScriptãã³ã¬ãŒã¿ã¯ã匷åãªã¡ã¿ããã°ã©ãã³ã°æ©èœã§ãããã¯ã©ã¹ãã¡ãœãããããããã£ããã©ã¡ãŒã¿ã®æ¯ãèããä¿®æ£ãŸãã¯æ¡åŒµããããã®ç°¡æœã§å®£èšçãªæ¹æ³ãæäŸããŸãããã³ã¬ãŒã¿ã¯ã³ãŒãã®å¯èªæ§ãšä¿å®æ§ãå€§å¹ ã«åäžãããããšãã§ããŸãããç¹ã«ã¡ã¿ããŒã¿åŠçãåå ã§ããã©ãŒãã³ã¹ã®ãªãŒããŒããããåŒãèµ·ããå¯èœæ§ããããŸãããã®èšäºã§ã¯ãJavaScriptãã³ã¬ãŒã¿ã®ããã©ãŒãã³ã¹ãžã®åœ±é¿ãæ·±ãæãäžããã¡ã¿ããŒã¿åŠçã®ãªãŒããŒãããã«çŠç¹ãåœãŠããã®åœ±é¿ã軜æžããããã®æŠç¥ãæäŸããŸãã
JavaScriptãã³ã¬ãŒã¿ãšã¯ïŒ
ãã³ã¬ãŒã¿ã¯ãæ¢åã®ãªããžã§ã¯ãã®æ§é ã倿Žããããšãªããè¿œå æ©èœã远å ã§ãããã¶ã€ã³ãã¿ãŒã³ã§ãããèšèªæ©èœïŒçŸåšECMAScriptã®ã¹ããŒãž3ææ¡ïŒã§ããã©ãããŒããšã³ãã³ãµãŒãšèãããšããã§ããããAngularã®ãããªãã¬ãŒã ã¯ãŒã¯ã§å€çšãããŠãããJavaScriptãTypeScriptã®éçºã§ãŸããŸã人æ°ãé«ãŸã£ãŠããŸãã
JavaScriptãTypeScriptã§ã¯ããã³ã¬ãŒã¿ã¯@èšå·ãæ¥é èŸãšããè£
食ããèŠçŽ ïŒäŸïŒã¯ã©ã¹ãã¡ãœãããããããã£ããã©ã¡ãŒã¿ïŒã®å®£èšã®çŽåã«é
眮ããã颿°ã§ããããã«ãããã¡ã¿ããã°ã©ãã³ã°ã®ããã®å®£èšçãªæ§æãæäŸãããå®è¡æã«ã³ãŒãã®æ¯ãèãã倿Žã§ããŸãã
äŸ (TypeScript):
function logMethod(target: any, propertyKey: string, descriptor: PropertyDescriptor) {
const originalMethod = descriptor.value;
descriptor.value = function(...args: any[]) {
console.log(`Calling method: ${propertyKey} with arguments: ${JSON.stringify(args)}`);
const result = originalMethod.apply(this, args);
console.log(`Method ${propertyKey} returned: ${result}`);
return result;
};
return descriptor;
}
class MyClass {
@logMethod
add(x: number, y: number): number {
return x + y;
}
}
const myInstance = new MyClass();
myInstance.add(5, 3); // Output will include logging information
ãã®äŸã§ã¯ã@logMethodããã³ã¬ãŒã¿ã§ããããã¯ãã¿ãŒã²ãããªããžã§ã¯ãïŒã¯ã©ã¹ã®ãããã¿ã€ãïŒãããããã£ããŒïŒã¡ãœããåïŒãããããã£èšè¿°åïŒã¡ãœããã«é¢ããæ
å ±ãå«ããªããžã§ã¯ãïŒã®3ã€ã®åŒæ°ãåã颿°ã§ãããã®ãã³ã¬ãŒã¿ã¯ãå
ã®ã¡ãœããã倿ŽããŠããã®å
¥åãšåºåããã°ã«èšé²ããŸãã
ãã³ã¬ãŒã¿ã«ãããã¡ã¿ããŒã¿ã®åœ¹å²
ã¡ã¿ããŒã¿ã¯ããã³ã¬ãŒã¿ã®æ©èœã«ãããŠéèŠãªåœ¹å²ãæãããŸããã¡ã¿ããŒã¿ãšã¯ãã¯ã©ã¹ãã¡ãœãããããããã£ããŸãã¯ãã©ã¡ãŒã¿ã«é¢é£ä»ããããæ å ±ã§ããã®å®è¡ããžãã¯ã«çŽæ¥å«ãŸãããã®ã§ã¯ãããŸããããã³ã¬ãŒã¿ã¯ãã°ãã°ã¡ã¿ããŒã¿ã«äŸåããŠè£ 食ãããèŠçŽ ã«é¢ããæ å ±ãä¿åã»ååŸããç¹å®ã®æ§æãæ¡ä»¶ã«åºã¥ããŠãã®æ¯ãèãã倿Žã§ããããã«ããŸãã
ã¡ã¿ããŒã¿ã¯éåžžãTypeScriptãã³ã¬ãŒã¿ã§äžè¬çã«äœ¿çšãããæšæºã©ã€ãã©ãªã§ããreflect-metadataã®ãããªã©ã€ãã©ãªã䜿çšããŠä¿åãããŸãããã®ã©ã€ãã©ãªã䜿çšãããšãReflect.defineMetadataãReflect.getMetadataãããã³é¢é£ãã颿°ã䜿çšããŠãã¯ã©ã¹ãã¡ãœãããããããã£ããã©ã¡ãŒã¿ã«ä»»æã®ããŒã¿ãé¢é£ä»ããããšãã§ããŸãã
reflect-metadataã䜿çšããäŸ:
import 'reflect-metadata';
const requiredMetadataKey = Symbol('required');
function required(target: Object, propertyKey: string | symbol, parameterIndex: number) {
let existingRequiredParameters: number[] = Reflect.getOwnMetadata(requiredMetadataKey, target, propertyKey) || [];
existingRequiredParameters.push(parameterIndex);
Reflect.defineMetadata(requiredMetadataKey, existingRequiredParameters, target, propertyKey);
}
function validate(target: any, propertyName: string, descriptor: TypedPropertyDescriptor) {
let method = descriptor.value!;
descriptor.value = function () {
let requiredParameters: number[] = Reflect.getOwnMetadata(requiredMetadataKey, target, propertyName);
if (requiredParameters) {
for (let parameterIndex of requiredParameters) {
if (arguments.length <= parameterIndex || arguments[parameterIndex] === undefined) {
throw new Error("Missing required argument.");
}
}
}
return method.apply(this, arguments);
}
}
class Greeter {
greeting: string;
constructor(message: string) {
this.greeting = message;
}
@validate
greet(@required name: string) {
return "Hello " + name + ", " + this.greeting;
}
}
ãã®äŸã§ã¯ã@requiredãã³ã¬ãŒã¿ãreflect-metadataã䜿çšããŠå¿
é ãã©ã¡ãŒã¿ã®ã€ã³ããã¯ã¹ãä¿åããŸãããã®åŸã@validateãã³ã¬ãŒã¿ããã®ã¡ã¿ããŒã¿ãååŸããŠããã¹ãŠã®å¿
é ãã©ã¡ãŒã¿ãæäŸãããŠããããšãæ€èšŒããŸãã
ã¡ã¿ããŒã¿åŠçã®ããã©ãŒãã³ã¹ãªãŒããŒããã
ã¡ã¿ããŒã¿ã¯ãã³ã¬ãŒã¿ã®æ©èœã«äžå¯æ¬ ã§ããããã®åŠçã¯ããã©ãŒãã³ã¹ã®ãªãŒããŒããããåŒãèµ·ããå¯èœæ§ããããŸãããªãŒããŒãããã¯ããã€ãã®èŠå ããçºçããŸãïŒ
- ã¡ã¿ããŒã¿ã®ä¿åãšååŸïŒ
reflect-metadataã®ãããªã©ã€ãã©ãªã䜿çšããŠã¡ã¿ããŒã¿ãä¿åããã³ååŸããã«ã¯ã颿°åŒã³åºããšããŒã¿æ€çŽ¢ã䌎ããCPUãµã€ã¯ã«ãšã¡ã¢ãªãæ¶è²»ããå¯èœæ§ããããŸããä¿åã»ååŸããã¡ã¿ããŒã¿ãå€ãã»ã©ããªãŒããŒãããã¯å€§ãããªããŸãã - ãªãã¬ã¯ã·ã§ã³æäœïŒ ã¯ã©ã¹æ§é ãã¡ãœããã·ã°ããã£ã®æ€æ»ãªã©ã®ãªãã¬ã¯ã·ã§ã³æäœã¯ãèšç®ã³ã¹ããé«ããªãå¯èœæ§ããããŸãããã³ã¬ãŒã¿ã¯ãã°ãã°ãªãã¬ã¯ã·ã§ã³ã䜿çšããŠè£ 食ãããèŠçŽ ã®æ¯ãèããã©ã®ããã«å€æŽããããæ±ºå®ãããããå šäœã®ãªãŒããŒããããå¢å ããŸãã
- ãã³ã¬ãŒã¿ã®å®è¡ïŒ åãã³ã¬ãŒã¿ã¯ã¯ã©ã¹å®çŸ©æã«å®è¡ããã颿°ã§ãããã³ã¬ãŒã¿ã®æ°ãå€ããè€éã§ããã»ã©ãã¯ã©ã¹ã®å®çŸ©ã«æéãããããèµ·åæéãé·ããªããŸãã
- å®è¡æã®å€æŽïŒ ãã³ã¬ãŒã¿ã¯å®è¡æã«ã³ãŒãã®æ¯ãèãã倿Žãããããéçã«ã³ã³ãã€ã«ãããã³ãŒããšæ¯èŒããŠãªãŒããŒããããçããå¯èœæ§ããããŸããããã¯ãJavaScriptãšã³ãžã³ãå®è¡äžã«è¿œå ã®ãã§ãã¯ãšå€æŽãè¡ãå¿ èŠãããããã§ãã
圱é¿ã®æž¬å®
ãã³ã¬ãŒã¿ã®ããã©ãŒãã³ã¹ãžã®åœ±é¿ã¯åŸ®åŠã§ãããç¹ã«ããã©ãŒãã³ã¹ãéèŠãªã¢ããªã±ãŒã·ã§ã³ã倿°ã®ãã³ã¬ãŒã¿ã䜿çšããå Žåã«ã¯é¡èã«ãªãããšããããŸããæé©åãå¿ èŠãªã»ã©é倧ãªåœ±é¿ããããã©ãããçè§£ããããã«ã圱é¿ã枬å®ããããšãéèŠã§ãã
枬å®ããŒã«ïŒ
- ãã©ãŠã¶éçºè ããŒã«ïŒ Chrome DevToolsãFirefox Developer Toolsãªã©ã®ããŒã«ã¯ããã³ã¬ãŒã¿é¢æ°ãã¡ã¿ããŒã¿æäœãå«ãJavaScriptã³ãŒãã®å®è¡æéãæž¬å®ã§ãããããã¡ã€ãªã³ã°æ©èœãæäŸããŸãã
- ããã©ãŒãã³ã¹ç£èŠããŒã«ïŒ New RelicãDatadogãDynatraceãªã©ã®ããŒã«ã¯ããã³ã¬ãŒã¿ãå šäœã®ããã©ãŒãã³ã¹ã«äžãã圱é¿ãå«ããã¢ããªã±ãŒã·ã§ã³ã®è©³çްãªããã©ãŒãã³ã¹ã¡ããªã¯ã¹ãæäŸã§ããŸãã
- ãã³ãããŒã¯ã©ã€ãã©ãªïŒ Benchmark.jsã®ãããªã©ã€ãã©ãªã䜿çšãããšããã³ã¬ãŒã¿é¢æ°ãã¡ã¿ããŒã¿æäœãªã©ã®ç¹å®ã®ã³ãŒãã¹ããããã®ããã©ãŒãã³ã¹ã枬å®ããããã®ãã€ã¯ããã³ãããŒã¯ãäœæã§ããŸãã
ãã³ãããŒã¯ã®äŸ (Benchmark.jsã䜿çš):
const Benchmark = require('benchmark');
require('reflect-metadata');
const metadataKey = Symbol('test');
class TestClass {
@Reflect.metadata(metadataKey, 'testValue')
testMethod() {}
}
const instance = new TestClass();
const suite = new Benchmark.Suite;
suite.add('Get Metadata', function() {
Reflect.getMetadata(metadataKey, instance, 'testMethod');
})
.on('cycle', function(event: any) {
console.log(String(event.target));
})
.on('complete', function() {
console.log('Fastest is ' + this.filter('fastest').map('name'));
})
.run({ 'async': true });
ãã®äŸã§ã¯ãBenchmark.jsã䜿çšããŠReflect.getMetadataã®ããã©ãŒãã³ã¹ã枬å®ããŸãããã®ãã³ãããŒã¯ãå®è¡ãããšãã¡ã¿ããŒã¿ååŸã«é¢é£ãããªãŒããŒãããã®æèŠãã€ããããšãã§ããŸãã
ããã©ãŒãã³ã¹ãªãŒããŒãããã軜æžããããã®æŠç¥
JavaScriptãã³ã¬ãŒã¿ãšã¡ã¿ããŒã¿åŠçã«é¢é£ããããã©ãŒãã³ã¹ãªãŒããŒãããã軜æžããããã«ãããã€ãã®æŠç¥ãæ¡çšã§ããŸãïŒ
- ã¡ã¿ããŒã¿ã®äœ¿çšãæå°éã«æããïŒ äžèŠãªã¡ã¿ããŒã¿ã®ä¿åãé¿ããŠãã ããããã³ã¬ãŒã¿ãæ¬åœã«å¿ èŠãšããæ å ±ãæ éã«æ€èšããäžå¯æ¬ ãªããŒã¿ã®ã¿ãä¿åããŸãã
- ã¡ã¿ããŒã¿ã¢ã¯ã»ã¹ãæé©åããïŒ é »ç¹ã«ã¢ã¯ã»ã¹ãããã¡ã¿ããŒã¿ããã£ãã·ã¥ããŠãæ€çŽ¢åæ°ãæžãããŸããã¡ã¿ããŒã¿ãã¡ã¢ãªã«ä¿åããŠè¿ éã«ååŸã§ãããã£ãã·ã¥ã¡ã«ããºã ãå®è£ ããŸãã
- ãã³ã¬ãŒã¿ãè³¢æã«äœ¿çšããïŒ ãã³ã¬ãŒã¿ã倧ããªäŸ¡å€ãæäŸããå Žåã«ã®ã¿é©çšããŸããç¹ã«ã³ãŒãã®ããã©ãŒãã³ã¹ãéèŠãªã»ã¯ã·ã§ã³ã§ã®ãã³ã¬ãŒã¿ã®ä¹±çšã¯é¿ããŠãã ããã
- ã³ã³ãã€ã«æã¡ã¿ããã°ã©ãã³ã°ïŒ ã³ãŒãçæãAST倿ãªã©ãã³ã³ãã€ã«æã®ã¡ã¿ããã°ã©ãã³ã°æè¡ãæ€èšããå®è¡æã®ã¡ã¿ããŒã¿åŠçãå®å šã«åé¿ããŸããBabelãã©ã°ã€ã³ãªã©ã®ããŒã«ã䜿çšããŠã³ã³ãã€ã«æã«ã³ãŒãã倿ããå®è¡æã®ãã³ã¬ãŒã¿ã®å¿ èŠæ§ããªããããšãã§ããŸãã
- ã«ã¹ã¿ã ã¡ã¿ããŒã¿ã®å®è£
ïŒ ç¹å®ã®ãŠãŒã¹ã±ãŒã¹ã«æé©åãããã«ã¹ã¿ã ã¡ã¿ããŒã¿ä¿åã¡ã«ããºã ã®å®è£
ãæ€èšããŸããããã«ããã
reflect-metadataã®ãããªæ±çšã©ã€ãã©ãªã䜿çšãããããåªããããã©ãŒãã³ã¹ãåŸãããå¯èœæ§ããããŸãããã ããè€éããå¢ãå¯èœæ§ãããããæ³šæãå¿ èŠã§ãã - é å»¶åæåïŒ å¯èœã§ããã°ããã³ã¬ãŒã¿ã®å®è¡ãå®éã«å¿ èŠã«ãªããŸã§é å»¶ãããŸããããã«ãããã¢ããªã±ãŒã·ã§ã³ã®åæèµ·åæéãççž®ã§ããŸãã
- ã¡ã¢åïŒ ãã³ã¬ãŒã¿ãé«ã³ã¹ããªèšç®ãå®è¡ããå Žåã¯ãã¡ã¢åã䜿çšããŠèšç®çµæããã£ãã·ã¥ããäžèŠãªåå®è¡ãé¿ããŸãã
- ã³ãŒãåå²ïŒ ã³ãŒãåå²ãå®è£ ããŠãå¿ èŠãªã¢ãžã¥ãŒã«ãšãã³ã¬ãŒã¿ãå¿ èŠãªãšãã«ã®ã¿ããŒãããããã«ããŸããããã«ãããã¢ããªã±ãŒã·ã§ã³ã®åæããŒãæéãæ¹åã§ããŸãã
- ãããã¡ã€ãªã³ã°ãšæé©åïŒ å®æçã«ã³ãŒãããããã¡ã€ãªã³ã°ããŠããã³ã¬ãŒã¿ãšã¡ã¿ããŒã¿åŠçã«é¢é£ããããã©ãŒãã³ã¹ã®ããã«ããã¯ãç¹å®ããŸãããããã¡ã€ãªã³ã°ããŒã¿ã䜿çšããŠæé©åäœæ¥ãé²ããŸãã
æé©åã®å®è·µäŸ
1. ã¡ã¿ããŒã¿ã®ãã£ãã·ã¥ïŒ
const metadataCache = new Map();
function getCachedMetadata(target: any, propertyKey: string, metadataKey: any) {
const cacheKey = `${target.constructor.name}-${propertyKey}-${String(metadataKey)}`;
if (metadataCache.has(cacheKey)) {
return metadataCache.get(cacheKey);
}
const metadata = Reflect.getMetadata(metadataKey, target, propertyKey);
metadataCache.set(cacheKey, metadata);
return metadata;
}
function myDecorator(target: any, propertyKey: string, descriptor: PropertyDescriptor) {
// Use getCachedMetadata instead of Reflect.getMetadata
const metadataValue = getCachedMetadata(target, propertyKey, 'my-metadata');
// ...
}
ãã®äŸã§ã¯ãReflect.getMetadataã®ç¹°ãè¿ãåŒã³åºããé¿ããããã«ãã¡ã¿ããŒã¿ãMapã«ãã£ãã·ã¥ããæ¹æ³ã瀺ããŠããŸãã
2. Babelã«ããã³ã³ãã€ã«æå€æïŒ
Babelãã©ã°ã€ã³ã䜿çšãããšãã³ã³ãã€ã«æã«ãã³ã¬ãŒã¿ã³ãŒãã倿ããå®è¡æã®ãªãŒããŒãããã广çã«æé€ã§ããŸããäŸãã°ããã³ã¬ãŒã¿åŒã³åºããã¯ã©ã¹ãã¡ãœãããžã®çŽæ¥çãªå€æŽã«çœ®ãæããããšãã§ããŸãã
äŸïŒæŠå¿µçïŒïŒ
ç°¡åãªãã®ã³ã°ãã³ã¬ãŒã¿ããããšããŸãïŒ
function log(target: any, propertyKey: string, descriptor: PropertyDescriptor) {
const originalMethod = descriptor.value;
descriptor.value = function(...args: any[]) {
console.log(`Calling ${propertyKey} with ${args}`);
const result = originalMethod.apply(this, args);
console.log(`Result: ${result}`);
return result;
};
}
class MyClass {
@log
myMethod(arg: number) {
return arg * 2;
}
}
Babelãã©ã°ã€ã³ã¯ãããæ¬¡ã®ããã«å€æã§ããŸãïŒ
class MyClass {
myMethod(arg: number) {
console.log(`Calling myMethod with ${arg}`);
const result = arg * 2;
console.log(`Result: ${result}`);
return result;
}
}
ãã³ã¬ãŒã¿ã¯å¹æçã«ã€ã³ã©ã€ã³åãããå®è¡æã®ãªãŒããŒããããæé€ãããŸãã
å®äžçã§ã®èæ ®äºé
ãã³ã¬ãŒã¿ã®ããã©ãŒãã³ã¹ãžã®åœ±é¿ã¯ãç¹å®ã®ãŠãŒã¹ã±ãŒã¹ããã³ã¬ãŒã¿èªäœã®è€éãã«ãã£ãŠç°ãªããŸããå€ãã®ã¢ããªã±ãŒã·ã§ã³ã§ã¯ããªãŒããŒãããã¯ç¡èŠã§ããçšåºŠã§ããããã³ã¬ãŒã¿ã䜿çšããå©ç¹ãããã©ãŒãã³ã¹ã³ã¹ããäžåããŸããããããããã©ãŒãã³ã¹ãéèŠãªã¢ããªã±ãŒã·ã§ã³ã§ã¯ãããã©ãŒãã³ã¹ãžã®åœ±é¿ãæ éã«æ€èšããé©åãªæé©åæŠç¥ãé©çšããããšãéèŠã§ãã
ã±ãŒã¹ã¹ã¿ãã£ïŒAngularã¢ããªã±ãŒã·ã§ã³
Angularã¯ãã³ã³ããŒãã³ãããµãŒãã¹ãã¢ãžã¥ãŒã«ã«ãã³ã¬ãŒã¿ãå€çšããŸããAngularã®AOTïŒAhead-of-TimeïŒã³ã³ãã€ã«ã¯å®è¡æã®ãªãŒããŒãããã®äžéšã軜æžããã®ã«åœ¹ç«ã¡ãŸãããç¹ã«å€§èŠæš¡ã§è€éãªã¢ããªã±ãŒã·ã§ã³ã§ã¯ããã³ã¬ãŒã¿ã®äœ¿çšã«æ³šæããããšãäŸç¶ãšããŠéèŠã§ããé å»¶èªã¿èŸŒã¿ãå¹ççãªå€æŽæ€åºæŠç¥ãªã©ã®ãã¯ããã¯ã¯ãããã©ãŒãã³ã¹ãããã«åäžãããããšãã§ããŸãã
åœéåïŒi18nïŒãšå°ååïŒl10nïŒã«é¢ããèæ ®äºé ïŒ
ã°ããŒãã«ãªãŠãŒã¶ãŒåãã«ã¢ããªã±ãŒã·ã§ã³ãéçºããå Žåãi18nãšl10nã¯éåžžã«éèŠã§ãããã³ã¬ãŒã¿ã䜿çšããŠç¿»èš³ãå°ååããŒã¿ã管çã§ããŸãããããããããã®ç®çã§ãã³ã¬ãŒã¿ãé床ã«äœ¿çšãããšãããã©ãŒãã³ã¹ã®åé¡ã«ã€ãªããå¯èœæ§ããããŸããã¢ããªã±ãŒã·ã§ã³ã®ããã©ãŒãã³ã¹ãžã®åœ±é¿ãæå°éã«æããããã«ãå°ååããŒã¿ã®ä¿åããã³ååŸæ¹æ³ãæé©åããããšãäžå¯æ¬ ã§ãã
çµè«
JavaScriptãã³ã¬ãŒã¿ã¯ãã³ãŒãã®å¯èªæ§ãšä¿å®æ§ãåäžããã匷åãªæ¹æ³ãæäŸããŸãããã¡ã¿ããŒã¿åŠçã«ããããã©ãŒãã³ã¹ã®ãªãŒããŒããããåŒãèµ·ããå¯èœæ§ããããŸãããªãŒããŒãããã®åå ãçè§£ããé©åãªæé©åæŠç¥ãé©çšããããšã§ãã¢ããªã±ãŒã·ã§ã³ã®ããã©ãŒãã³ã¹ãæãªãããšãªããã³ã¬ãŒã¿ã广çã«äœ¿çšã§ããŸããç¹å®ã®ãŠãŒã¹ã±ãŒã¹ã«ããããã³ã¬ãŒã¿ã®åœ±é¿ã枬å®ããããã«å¿ããŠæé©åã®åãçµã¿ã調æŽããããšãå¿ããªãã§ãã ããããã€ãã©ãã§ãã³ã¬ãŒã¿ã䜿çšããããè³¢æã«éžæããããã©ãŒãã³ã¹ãéå€§ãªæžå¿µäºé ã«ãªã£ãå Žåã¯ãåžžã«ä»£æ¿ã¢ãããŒããæ€èšããŠãã ããã
æçµçã«ããã³ã¬ãŒã¿ã䜿çšãããã©ããã®æ±ºå®ã¯ãã³ãŒãã®æå¿«ããä¿å®æ§ãããã³ããã©ãŒãã³ã¹ã®éã®ãã¬ãŒããªãã«äŸåããŸãããããã®èŠçŽ ãæ éã«æ€èšããããšã§ãã°ããŒãã«ãªãŠãŒã¶ãŒåãã®é«å質ã§ããã©ãŒãã³ã¹ã®é«ãJavaScriptã¢ããªã±ãŒã·ã§ã³ã«ã€ãªãããæ å ±ã«åºã¥ããæææ±ºå®ãè¡ãããšãã§ããŸãã